﻿using BLevy.Datos.Interfases;
using BLevy.Entidad;
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Dapper;
using DapperExtensions;

namespace BLevy.Datos.Repositories
{
    public interface ICarenciaRepository : IRepository<Carencia>
    {
        Carencia FindByEdad(int edad);
    }

    public class CarenciaRepository : ICarenciaRepository
    {
        protected readonly IDbConnection _db;

        public CarenciaRepository()
        {
            try
            {
                _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString());
            }
            catch(Exception e)
            {
                throw e;
            }
        }

        public IList<Carencia> FindAll()
        {
            string query = "SELECT * FROM CARENCIAS";

            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Query<Carencia>(query).ToList();
                }
            }
            catch(Exception e)
            {
                throw e;
            }
        }

        public IQueryable<Carencia> Find(System.Linq.Expressions.Expression<Func<Carencia, bool>> predicate)
        {
            throw new NotImplementedException();
        }

        public Carencia FindById(int id)
        {
            string query = "SELECT * FROM CARENCIAS " +
                "WHERE ID = @id";

            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Query<Carencia>(query, new { id = id }).SingleOrDefault();
                }
            }
            catch(Exception e)
            {
                throw e;
            }
        }

        public int Add(Carencia newEntity)
        {
            string query = "INSERT INTO CARENCIAS (NOMBRE, EDAD_DESDE, EDAD_HASTA, PERIODO, ACTIVO) " +
                "VALUES (@nombre, @edad_desde, @edad_hasta, @periodo, @activo)";

            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Execute(query, new
                    {
                        nombre = newEntity.nombre,
                        edad_desde = newEntity.edad_desde,
                        edad_hasta = newEntity.edad_hasta,
                        periodo = newEntity.periodo,
                        activo = newEntity.activo
                    });
                }
            }
            catch(Exception e)
            {
                throw e;
            }

        }

        public int Remove(int id)
        {
            string query = "UPDATE CARENCIAS SET ACTIVO = 0 " +
                "WHERE ID = @id";

            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Execute(query, new { id = id });
                }
            }
            catch(Exception e)
            {
                throw e;
            }
        }

        public int Modify(Carencia entity)
        {
            string query = "UPDATE CARENCIAS SET NOMBRE = @nombre, EDAD_DESDE = @edad_desde, " +
                "EDAD_HASTA = @edad_hasta, PERIODO = @periodo, ACTIVO = @activo " +
                "WHERE ID = @id";

            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Execute(query, new
                    {
                        nombre = entity.nombre,
                        edad_desde = entity.edad_desde,
                        edad_hasta = entity.edad_hasta,
                        periodo = entity.periodo,
                        activo = entity.activo,
                        id = entity.id
                    });
                }
            }
            catch(Exception e)
            {
                throw e;
            }
        }

        public Carencia FindByEdad(int edad)
        {
            string query = "SELECT * FROM CARENCIAS " +
                "WHERE @edad BETWEEN EDAD_DESDE AND EDAD_HASTA";

            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Query<Carencia>(query, new { edad = edad }).SingleOrDefault();
                }
            }
            catch(Exception e)
            {
                throw e;
            }
        }
    }
}
